<?php
namespace app\modules\supplier\call;

use think\Request;
use think\Hook;
/**
 * Class CallBase 内部静态通讯接口抽象基类
 * @package app\common\base
 * @version 1.0
 * @author ygzhang<ygzhang.cn@msn.com>
 */
abstract class CallBase
{

    private static $_init = array();//Call通讯子类局部的动态变量运行数据[初始化状态]
	protected static $_auth_expire_interval = 3600;//用户会话自动过期900 => 15分钟
    protected static $_is_login = false;//Call通讯全局静态[用户账户资料]
    protected static $_account = [];//Call通讯全局静态[用户账户资料]
    protected static $_client_device = 0;//Call通讯全局静态[用户请求层设备类型(数字)]
    protected static $_client_ip=0;//客户端IPV4地址(数字)
    /**
     * 注意子类必须延迟绑定（重新定义）下面的两个Call运行状态变量
     * Call通讯全局静态[返回错误消息],注意：$_error属于后期绑定变量必须在基类中重新定义
     */
    protected static $_error = array();
    /**
     * @var \think\Request Request实例
     */
    protected static $request;

    /**
     * 初始化及架构函数
     * 注意：Call通讯是静态类，入口方法也是静态方法，只有New CallCassName()架构函数才会运行，Call的使用场景多元化，因此抛弃架构函数
     * 所以系统架构约定Call通讯类中必须定义:
     * protected static function _initCall() 初始化方法，并在每个静态入口方法首要位置调用一次self::_initCall 方法)
     * 定义 _initCall 初始化方法时，首要位置调用 parent::_initBase();
     * @access protected
     * @param  boolean $force
     */
    protected static function _initCall($force = false)
    {
    }

    protected static function _initBase($force = false)
    {
        if (!is_array(self::$_init)) {
            self::$_init = array('base' => false);
        } elseif (!isset(self::$_init['base'])) {
            self::$_init = array('base' => false);
        }
        if (self::$_init['base'] === false || $force) {
            defined('TIMESTAMP') or define('TIMESTAMP', time());
            self::$request = Request::instance();
            self::$_error = array();
            self::$_account = session('account');
            if (!is_array(self::$_account) || empty(self::$_account)) {
                self::$_account = null;
                self::$_is_login = false;
            } else {
                self::$_is_login = true;
            }
            self::$_client_device = get_client_device(1);
            self::$_client_ip=self::$request->ip(1);
            if (self::$_is_login) {
	            if (data_auth_sign(self::$_account)==session('account_sign')) {
		            self::$_account['activity_time'] = TIMESTAMP;
		            self::$_account['activity_ip'] = self::$_client_ip;
		            session('account', self::$_account);
		            session('account_sign', data_auth_sign(self::$_account));
		            if(false==self::$_account['is_remember'] || self::$_account['is_remember']<1){
			            session('account_exptime', TIMESTAMP + self::$_auth_expire_interval);
		            }
	            } else {
	                self::$_error[] = "用户回话异常或已过期";
                    // $log = ['user_id' => self::$_account['user_id'], 'action_info' => '用户回话异常或已过期，强制注销了客户端登录状态'];
                    // Hook::listen('user_log_action', $log);
                    self::$_account = null;
                    self::$_is_login = false;
                    session('account', null);
                    session('account_sign', null);
                    session('account_exptime', null);
                    //注意，这里不清除cookie，客户端有可能存有认证信息client_account
	            }
            }else{
                session('account', null);
                session('account_sign', null);
                session('account_exptime', null);
                //注意，这里不清除cookie，客户端有可能存有认证信息client_account
             }


            self::$_init['base'] = true;
        }
    }

    /**
     * 设置Call初始化状态变量
     * @access protected
     * @param $value boolean
     * @param string $name 子类名称,可为空，默认约定为子类名
     * @return boolean
     * */
    final protected static function _setInit($value = true, $name = '')
    {
        $name = !empty($name) ? strip_tags(trim($name)) : get_called_class();
        if (empty($name))
            return false;
        self::$_init[$name] = $value ? true : false;
        return true;
    }

    /**
     * 获取Call是否初始化状态变量
     * @access protected
     * @param string $name 子类名称,可为空，默认约定为子类名
     * @return boolean
     * */
    final protected static function _getInit($name = '')
    {
        $name = !empty($name) ? strip_tags(trim($name)) : get_called_class();
        if (empty($name) || !isset(self::$_init[$name])) {
            self::$_init[$name] = false;
        }
        return self::$_init[$name];
    }
    public static function getAuthExpireInterval(){
    	return self::$_auth_expire_interval;
    }

    final public static function getError($format = ';')
    {
        if (!is_array(static::$_error) || count(static::$_error) < 1) {
            return '';
        }
        if ('p' == $format) {
            return '<p>' . implode('</p><p>', static::$_error) . '</p>';
        } elseif ('li' == $format) {
            return '<li>' . implode('</li><li>', static::$_error) . '</li>';
        } elseif ('br' == $format) {
            return implode('<br>', static::$_error);
        } else {
            return implode('; ', static::$_error);
        }
    }
}